package io.github.echarts.coordinator;

import io.github.echarts.model.coordinate.CoordinateSystem;
import io.github.echarts.model.coordinate.cartesian.CartesianCoordinateSystem;
import io.github.echarts.render.GraphicsRenderer;

import java.util.ArrayList;
import java.util.List;

/**
 * 坐标系渲染协调器
 * 负责协调坐标系的渲染过程
 */
public class CoordinateSystemRenderingCoordinator {
    
    /** 坐标系列表 */
    private List<CoordinateSystem> coordinateSystems;
    
    /** 渲染上下文 */
    private RenderContext renderContext;
    
    /**
     * 构造函数
     */
    public CoordinateSystemRenderingCoordinator() {
        coordinateSystems = new ArrayList<>();
    }
    
    /**
     * 设置渲染上下文
     * 
     * @param renderContext 渲染上下文
     */
    public void setRenderContext(RenderContext renderContext) {
        this.renderContext = renderContext;
    }
    
    /**
     * 添加坐标系
     * 
     * @param coordinateSystem 坐标系
     */
    public void addCoordinateSystem(CoordinateSystem coordinateSystem) {
        coordinateSystems.add(coordinateSystem);
    }
    
    /**
     * 批量添加坐标系
     * 
     * @param systems 坐标系列表
     */
    public void addCoordinateSystems(List<CoordinateSystem> systems) {
        if (systems != null) {
            coordinateSystems.addAll(systems);
        }
    }
    
    /**
     * 渲染所有坐标系
     * 
     * @param renderer 图形渲染器
     */
    public void renderCoordinateSystems(GraphicsRenderer renderer) {
        // 设置当前层为坐标系层
        renderer.setCurrentLayer("coordinateSystem");
        
        // 遍历渲染所有坐标系
        for (CoordinateSystem system : coordinateSystems) {
            renderCoordinateSystem(system, renderer);
        }
    }
    
    /**
     * 根据坐标系类型渲染单个坐标系
     * 
     * @param system 坐标系
     * @param renderer 图形渲染器
     */
    private void renderCoordinateSystem(CoordinateSystem system, GraphicsRenderer renderer) {
        // 根据不同类型的坐标系调用不同的渲染方法
        if (system instanceof CartesianCoordinateSystem) {
            renderCartesianCoordinateSystem((CartesianCoordinateSystem) system, renderer);
        }
        // 其他类型的坐标系渲染方法可以在这里添加
    }
    
    /**
     * 渲染笛卡尔坐标系
     * 
     * @param system 笛卡尔坐标系
     * @param renderer 图形渲染器
     */
    private void renderCartesianCoordinateSystem(CartesianCoordinateSystem system, GraphicsRenderer renderer) {
        // 获取坐标系布局区域
        RenderContext.CoordinateSystemInfo info = renderContext.getCoordinateSystemInfo(system.getId());
        if (info == null) {
            return;
        }
        
        // 渲染坐标轴
        renderCartesianAxes(system, info, renderer);
        
        // 渲染网格线
        renderCartesianGrid(system, info, renderer);
    }
    
    /**
     * 渲染笛卡尔坐标系的坐标轴
     * 
     * @param system 笛卡尔坐标系
     * @param info 坐标系信息
     * @param renderer 图形渲染器
     */
    private void renderCartesianAxes(CartesianCoordinateSystem system, RenderContext.CoordinateSystemInfo info, GraphicsRenderer renderer) {
        // 获取坐标系区域
        int x = (int) info.getArea().getX();
        int y = (int) info.getArea().getY();
        int width = (int) info.getArea().getWidth();
        int height = (int) info.getArea().getHeight();
        
        // 渲染X轴（水平线）- 逻辑坐标系中，X轴在底部
        renderer.drawLine(x, y, x + width, y, "#000000", 1, "solid");
        
        // 渲染Y轴（垂直线）- 逻辑坐标系中，Y轴在左侧
        renderer.drawLine(x, y, x, y + height, "#000000", 1, "solid");
        
        // 这里应添加坐标轴刻度、标签等的渲染
        // 暂时省略...
    }
    
    /**
     * 渲染笛卡尔坐标系的网格线
     * 
     * @param system 笛卡尔坐标系
     * @param info 坐标系信息
     * @param renderer 图形渲染器
     */
    private void renderCartesianGrid(CartesianCoordinateSystem system, RenderContext.CoordinateSystemInfo info, GraphicsRenderer renderer) {
        // 获取坐标系区域
        int x = (int) info.getArea().getX();
        int y = (int) info.getArea().getY();
        int width = (int) info.getArea().getWidth();
        int height = (int) info.getArea().getHeight();
        
        // 渲染水平网格线，每50个单位一条
        for (int i = 50; i < height; i += 50) {
            renderer.drawGridLine(x, y + i, x + width, y + i, "#CCCCCC", 1, "dashed");
        }
        
        // 渲染垂直网格线，每50个单位一条
        for (int i = 50; i < width; i += 50) {
            renderer.drawGridLine(x + i, y, x + i, y + height, "#CCCCCC", 1, "dashed");
        }
    }
} 